package com.yhn.testIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * @Author 岳浩楠
 * @Date 2024-05-21 21:15
 * @Version 1.0
 * 本类用于测试 读取一个文件的信息，并将其所有的内容拷贝到指定的文件里去
 */
public class IOMainApp {

    private static Logger logger = LoggerFactory.getLogger(IOMainApp.class);

    public static void main(String[] args) {
        execute();
    }

    public static void execute() {
        readAndWrite("DateUtils.txt", "D:\\testImg\\testIO");
    }

    /**
     * 该方法是将 读取 fileName  文件  并且输出到指定的fileOutputPath 路径下
     *
     * @param fileName
     * @param fileOutputPath
     */
    public static void readAndWrite(String fileName, String fileOutputPath) {

        /**
         *  准备工作
         */

        /**
         * 1. 首先我们先将输出文件的目录进行创建
         */

        File folder = new File(fileOutputPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }


        /**
         * 2. 其次我们创建一个新文件（这个文件里的内容就是我们从指定的文件名中读到的所有内容）
         */
        File file = new File(folder, fileName.replace(".txt", ".java"));

        /**
         *  3. 定义需要用到的所有输入流和输出流
         */

        OutputStream out = null;
        OutputStreamWriter outr = null;
        BufferedWriter bw = null;

        InputStream in = null;
        InputStreamReader inr = null;
        BufferedReader br = null;


        /**
         *  开始读取
         */

        try {
            /**
             *  1. 首先我们先得到fileName 这个文件
             */
            in = IOMainApp.class.getClassLoader().getResourceAsStream("template/" + fileName);
            inr = new InputStreamReader(in, "utf-8");
            br = new BufferedReader(inr);

            /**
             *  2. 定义输出的文件地址
             */
            out = new FileOutputStream(file);
            outr = new OutputStreamWriter(out, "utf-8");
            bw = new BufferedWriter(outr);

            /**
             *  3. 开始读取文件 并进行写入
             */
            String line = null;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            /**
             * 关闭流
             */

            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (inr != null) {
                try {
                    inr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


            if (outr != null) {
                try {
                    outr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

}
